home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / posixpath.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  12KB  |  446 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''Common operations on Posix pathnames.
  5.  
  6. Instead of importing this module directly, import os and refer to
  7. this module as os.path.  The "os.path" name is an alias for this
  8. module on Posix systems; on other systems (e.g. Mac, Windows),
  9. os.path provides the same operations in a manner specific to that
  10. platform, and is an alias to another module (e.g. macpath, ntpath).
  11.  
  12. Some of this can actually be useful on non-Posix systems too, e.g.
  13. for manipulation of the pathname component of URLs.
  14. '''
  15. import os
  16. import stat
  17. __all__ = [
  18.     'normcase',
  19.     'isabs',
  20.     'join',
  21.     'splitdrive',
  22.     'split',
  23.     'splitext',
  24.     'basename',
  25.     'dirname',
  26.     'commonprefix',
  27.     'getsize',
  28.     'getmtime',
  29.     'getatime',
  30.     'getctime',
  31.     'islink',
  32.     'exists',
  33.     'lexists',
  34.     'isdir',
  35.     'isfile',
  36.     'ismount',
  37.     'walk',
  38.     'expanduser',
  39.     'expandvars',
  40.     'normpath',
  41.     'abspath',
  42.     'samefile',
  43.     'sameopenfile',
  44.     'samestat',
  45.     'curdir',
  46.     'pardir',
  47.     'sep',
  48.     'pathsep',
  49.     'defpath',
  50.     'altsep',
  51.     'extsep',
  52.     'devnull',
  53.     'realpath',
  54.     'supports_unicode_filenames']
  55. curdir = '.'
  56. pardir = '..'
  57. extsep = '.'
  58. sep = '/'
  59. pathsep = ':'
  60. defpath = ':/bin:/usr/bin'
  61. altsep = None
  62. devnull = '/dev/null'
  63.  
  64. def normcase(s):
  65.     '''Normalize case of pathname.  Has no effect under Posix'''
  66.     return s
  67.  
  68.  
  69. def isabs(s):
  70.     '''Test whether a path is absolute'''
  71.     return s.startswith('/')
  72.  
  73.  
  74. def join(a, *p):
  75.     """Join two or more pathname components, inserting '/' as needed"""
  76.     path = a
  77.     for b in p:
  78.         if b.startswith('/'):
  79.             path = b
  80.             continue
  81.         if path == '' or path.endswith('/'):
  82.             path += b
  83.             continue
  84.         path += '/' + b
  85.     
  86.     return path
  87.  
  88.  
  89. def split(p):
  90.     '''Split a pathname.  Returns tuple "(head, tail)" where "tail" is
  91.     everything after the final slash.  Either part may be empty.'''
  92.     i = p.rfind('/') + 1
  93.     head = p[:i]
  94.     tail = p[i:]
  95.     if head and head != '/' * len(head):
  96.         head = head.rstrip('/')
  97.     
  98.     return (head, tail)
  99.  
  100.  
  101. def splitext(p):
  102.     '''Split the extension from a pathname.  Extension is everything from the
  103.     last dot to the end.  Returns "(root, ext)", either part may be empty.'''
  104.     i = p.rfind('.')
  105.     if i <= p.rfind('/'):
  106.         return (p, '')
  107.     else:
  108.         return (p[:i], p[i:])
  109.  
  110.  
  111. def splitdrive(p):
  112.     '''Split a pathname into drive and path. On Posix, drive is always
  113.     empty.'''
  114.     return ('', p)
  115.  
  116.  
  117. def basename(p):
  118.     '''Returns the final component of a pathname'''
  119.     return split(p)[1]
  120.  
  121.  
  122. def dirname(p):
  123.     '''Returns the directory component of a pathname'''
  124.     return split(p)[0]
  125.  
  126.  
  127. def commonprefix(m):
  128.     '''Given a list of pathnames, returns the longest common leading component'''
  129.     if not m:
  130.         return ''
  131.     
  132.     s1 = min(m)
  133.     s2 = max(m)
  134.     n = min(len(s1), len(s2))
  135.     for i in xrange(n):
  136.         if s1[i] != s2[i]:
  137.             return s1[:i]
  138.             continue
  139.     
  140.     return s1[:n]
  141.  
  142.  
  143. def getsize(filename):
  144.     '''Return the size of a file, reported by os.stat().'''
  145.     return os.stat(filename).st_size
  146.  
  147.  
  148. def getmtime(filename):
  149.     '''Return the last modification time of a file, reported by os.stat().'''
  150.     return os.stat(filename).st_mtime
  151.  
  152.  
  153. def getatime(filename):
  154.     '''Return the last access time of a file, reported by os.stat().'''
  155.     return os.stat(filename).st_atime
  156.  
  157.  
  158. def getctime(filename):
  159.     '''Return the metadata change time of a file, reported by os.stat().'''
  160.     return os.stat(filename).st_ctime
  161.  
  162.  
  163. def islink(path):
  164.     '''Test whether a path is a symbolic link'''
  165.     
  166.     try:
  167.         st = os.lstat(path)
  168.     except (os.error, AttributeError):
  169.         return False
  170.  
  171.     return stat.S_ISLNK(st.st_mode)
  172.  
  173.  
  174. def exists(path):
  175.     '''Test whether a path exists.  Returns False for broken symbolic links'''
  176.     
  177.     try:
  178.         st = os.stat(path)
  179.     except os.error:
  180.         return False
  181.  
  182.     return True
  183.  
  184.  
  185. def lexists(path):
  186.     '''Test whether a path exists.  Returns True for broken symbolic links'''
  187.     
  188.     try:
  189.         st = os.lstat(path)
  190.     except os.error:
  191.         return False
  192.  
  193.     return True
  194.  
  195.  
  196. def isdir(path):
  197.     '''Test whether a path is a directory'''
  198.     
  199.     try:
  200.         st = os.stat(path)
  201.     except os.error:
  202.         return False
  203.  
  204.     return stat.S_ISDIR(st.st_mode)
  205.  
  206.  
  207. def isfile(path):
  208.     '''Test whether a path is a regular file'''
  209.     
  210.     try:
  211.         st = os.stat(path)
  212.     except os.error:
  213.         return False
  214.  
  215.     return stat.S_ISREG(st.st_mode)
  216.  
  217.  
  218. def samefile(f1, f2):
  219.     '''Test whether two pathnames reference the same actual file'''
  220.     s1 = os.stat(f1)
  221.     s2 = os.stat(f2)
  222.     return samestat(s1, s2)
  223.  
  224.  
  225. def sameopenfile(fp1, fp2):
  226.     '''Test whether two open file objects reference the same file'''
  227.     s1 = os.fstat(fp1)
  228.     s2 = os.fstat(fp2)
  229.     return samestat(s1, s2)
  230.  
  231.  
  232. def samestat(s1, s2):
  233.     '''Test whether two stat buffers reference the same file'''
  234.     if s1.st_ino == s2.st_ino:
  235.         pass
  236.     return s1.st_dev == s2.st_dev
  237.  
  238.  
  239. def ismount(path):
  240.     '''Test whether a path is a mount point'''
  241.     
  242.     try:
  243.         s1 = os.stat(path)
  244.         s2 = os.stat(join(path, '..'))
  245.     except os.error:
  246.         return False
  247.  
  248.     dev1 = s1.st_dev
  249.     dev2 = s2.st_dev
  250.     if dev1 != dev2:
  251.         return True
  252.     
  253.     ino1 = s1.st_ino
  254.     ino2 = s2.st_ino
  255.     if ino1 == ino2:
  256.         return True
  257.     
  258.     return False
  259.  
  260.  
  261. def walk(top, func, arg):
  262.     """Directory tree walk with callback function.
  263.  
  264.     For each directory in the directory tree rooted at top (including top
  265.     itself, but excluding '.' and '..'), call func(arg, dirname, fnames).
  266.     dirname is the name of the directory, and fnames a list of the names of
  267.     the files and subdirectories in dirname (excluding '.' and '..').  func
  268.     may modify the fnames list in-place (e.g. via del or slice assignment),
  269.     and walk will only recurse into the subdirectories whose names remain in
  270.     fnames; this can be used to implement a filter, or to impose a specific
  271.     order of visiting.  No semantics are defined for, or required of, arg,
  272.     beyond that arg is always passed to func.  It can be used, e.g., to pass
  273.     a filename pattern, or a mutable object designed to accumulate
  274.     statistics.  Passing None for arg is common."""
  275.     
  276.     try:
  277.         names = os.listdir(top)
  278.     except os.error:
  279.         return None
  280.  
  281.     func(arg, top, names)
  282.     for name in names:
  283.         name = join(top, name)
  284.         
  285.         try:
  286.             st = os.lstat(name)
  287.         except os.error:
  288.             continue
  289.  
  290.         if stat.S_ISDIR(st.st_mode):
  291.             walk(name, func, arg)
  292.             continue
  293.     
  294.  
  295.  
  296. def expanduser(path):
  297.     '''Expand ~ and ~user constructions.  If user or $HOME is unknown,
  298.     do nothing.'''
  299.     if not path.startswith('~'):
  300.         return path
  301.     
  302.     i = path.find('/', 1)
  303.     if i < 0:
  304.         i = len(path)
  305.     
  306.     if i == 1:
  307.         if 'HOME' not in os.environ:
  308.             import pwd as pwd
  309.             userhome = pwd.getpwuid(os.getuid()).pw_dir
  310.         else:
  311.             userhome = os.environ['HOME']
  312.     else:
  313.         import pwd as pwd
  314.         
  315.         try:
  316.             pwent = pwd.getpwnam(path[1:i])
  317.         except KeyError:
  318.             return path
  319.  
  320.         userhome = pwent.pw_dir
  321.     if userhome.endswith('/'):
  322.         i += 1
  323.     
  324.     return userhome + path[i:]
  325.  
  326. _varprog = None
  327.  
  328. def expandvars(path):
  329.     '''Expand shell variables of form $var and ${var}.  Unknown variables
  330.     are left unchanged.'''
  331.     global _varprog
  332.     if '$' not in path:
  333.         return path
  334.     
  335.     if not _varprog:
  336.         import re as re
  337.         _varprog = re.compile('\\$(\\w+|\\{[^}]*\\})')
  338.     
  339.     i = 0
  340.     while True:
  341.         m = _varprog.search(path, i)
  342.         if not m:
  343.             break
  344.         
  345.         (i, j) = m.span(0)
  346.         name = m.group(1)
  347.         if name.startswith('{') and name.endswith('}'):
  348.             name = name[1:-1]
  349.         
  350.         if name in os.environ:
  351.             tail = path[j:]
  352.             path = path[:i] + os.environ[name]
  353.             i = len(path)
  354.             path += tail
  355.             continue
  356.         i = j
  357.     return path
  358.  
  359.  
  360. def normpath(path):
  361.     '''Normalize path, eliminating double slashes, etc.'''
  362.     if path == '':
  363.         return '.'
  364.     
  365.     initial_slashes = path.startswith('/')
  366.     if initial_slashes and path.startswith('//') and not path.startswith('///'):
  367.         initial_slashes = 2
  368.     
  369.     comps = path.split('/')
  370.     new_comps = []
  371.     for comp in comps:
  372.         if comp in ('', '.'):
  373.             continue
  374.         
  375.         if not comp != '..':
  376.             if (not initial_slashes or not new_comps or new_comps) and new_comps[-1] == '..':
  377.                 new_comps.append(comp)
  378.                 continue
  379.         if new_comps:
  380.             new_comps.pop()
  381.             continue
  382.     
  383.     comps = new_comps
  384.     path = '/'.join(comps)
  385.     if initial_slashes:
  386.         path = '/' * initial_slashes + path
  387.     
  388.     if not path:
  389.         pass
  390.     return '.'
  391.  
  392.  
  393. def abspath(path):
  394.     '''Return an absolute path.'''
  395.     if not isabs(path):
  396.         path = join(os.getcwd(), path)
  397.     
  398.     return normpath(path)
  399.  
  400.  
  401. def realpath(filename):
  402.     '''Return the canonical path of the specified filename, eliminating any
  403. symbolic links encountered in the path.'''
  404.     if isabs(filename):
  405.         bits = [
  406.             '/'] + filename.split('/')[1:]
  407.     else:
  408.         bits = [
  409.             ''] + filename.split('/')
  410.     for i in range(2, len(bits) + 1):
  411.         component = join(*bits[0:i])
  412.         if islink(component):
  413.             resolved = _resolve_link(component)
  414.             if resolved is None:
  415.                 return abspath(join(*[
  416.                     component] + bits[i:]))
  417.             else:
  418.                 newpath = join(*[
  419.                     resolved] + bits[i:])
  420.                 return realpath(newpath)
  421.         resolved is None
  422.     
  423.     return abspath(filename)
  424.  
  425.  
  426. def _resolve_link(path):
  427.     """Internal helper function.  Takes a path and follows symlinks
  428.     until we either arrive at something that isn't a symlink, or
  429.     encounter a path we've seen before (meaning that there's a loop).
  430.     """
  431.     paths_seen = []
  432.     while islink(path):
  433.         if path in paths_seen:
  434.             return None
  435.         
  436.         paths_seen.append(path)
  437.         resolved = os.readlink(path)
  438.         if not isabs(resolved):
  439.             dir = dirname(path)
  440.             path = normpath(join(dir, resolved))
  441.             continue
  442.         path = normpath(resolved)
  443.     return path
  444.  
  445. supports_unicode_filenames = False
  446.